Skip to content

NFS 在 Linux 上的使用

NFS 为 Network FileSystem 的简称,它的目的就是想让不同的机器、不同的操作系统可以彼此分享文件!

NFS Server 端的设定

查看是否安装 NFS

sh
$ rpm -qa | grep nfs
$ rpm -qa | grep rpcbind

安装 NFS

sh
$ yum install nfs-utils

配置 NFS

sh
$ vim /etc/exports
/www/filestore/ 192.168.0.0/24(rw,sync,no_root_squash)
[分享目录]      [IP网段(权限)]
  • 权限常见参数值 (就是小括号内的参数)
参数值内容说明
rw
ro
该目录分享的权限是可擦写 (read-write) 或只读 (read-only),但最终能不能读写,还是与文件系统的 rwx 及身份有关。
sync
async
sync 代表数据会同步写入到内存与硬盘中,async 则代表数据会先暂存于内存当中,而非直接写入硬盘!
no_root_squash
root_squash
客户端使用 NFS 文件系统的账号若为 root 时,系统该如何判断这个账号的身份? 默认的情况下,客户端 root 的身份会由 root_squash 的设定压缩成 nfsnobody, 如此对服务器的系统会较有保障。 但如果你想要开放客户端使用 root 身份来操作服务器的文件系统,那么这里就得要开 no_root_squash 才行!
all_squash不论登入 NFS 的用户身份为何, 他的身份都会被压缩成为匿名用户,通常也就是 nobody(nfsnobody) 啦!
anonuid
anongid
anon 意指 anonymous (匿名者) ,通常为 nobody(nfsnobody),但是你可以自行设定这个 UID 的值! 当然,这个 UID 必需要存在于你的 /etc/passwd 当中! anonuid 指的是 UID 而 anongid 则是群组的 GID 啰。

启动 NFS

sh
$ systemctl start rpcbind
$ systemctl start nfs

查看 RPC 服务注册情况

rpcinfo -p [IP|hostname]

rpcinfo -t|-u IP|hostname 程序名称

选项与参数:

-p :针对某 IP (不写默认为本机) 显示出所有的 port 与 porgram 的信息;

-t :针对某主机的某个程序检查其 TCP 封包所在的软件版本;

-u :针对某主机的某个程序检查其 UDP 封包所在的软件版本;

sh
# 显示出目前本机的 RPC 状态
$ rpcinfo -p localhost
program vers proto   port  service
100000    4   tcp    111  portmapper
100000    3   tcp    111  portmapper
100000    2   tcp    111  portmapper
100000    4   udp    111  portmapper
100000    3   udp    111  portmapper
100000    2   udp    111  portmapper
100005    1   udp   1002  mountd
100005    1   tcp   1002  mountd
100005    2   udp   1002  mountd
100005    2   tcp   1002  mountd
100005    3   udp   1002  mountd
100005    3   tcp   1002  mountd
100003    3   tcp   2049  nfs
100003    4   tcp   2049  nfs
100227    3   tcp   2049  nfs_acl
100003    3   udp   2049  nfs
100003    4   udp   2049  nfs
100227    3   udp   2049  nfs_acl
100021    1   udp  30001  nlockmgr
100021    3   udp  30001  nlockmgr
100021    4   udp  30001  nlockmgr
100021    1   tcp  30001  nlockmgr
100021    3   tcp  30001  nlockmgr
100021    4   tcp  30001  nlockmgr
# 程序代号 NFS 版本 封包类型 端口  服务名称

# 针对 nfs 这个程序检查其相关的软件版本信息 (仅察看 TCP 封包)
$ rpcinfo -t localhost nfs
program 100003 version 3 ready and waiting
program 100003 version 4 ready and waiting
# 可以发现提供 nfs 的版本共有两种,分別是 3, 4

查看 NFS 状态

showmount [-ae] [hostname|IP]

选项与参数:

-a :显示目前主机与用戶端的 NFS 连线分享的状态;

-e :显示某部主机的 /etc/exports 所分享的目录资料。

  • 显示出刚刚我们所设定好的相关 exports 分享目录信息
sh
$ showmount -e localhost
Export list for localhost:
/www/filestore 192.168.0.0/24

查看 NFS 默认参数

sh
$ tail /var/lib/nfs/etab
/www/filestore  192.168.0.0/24(rw,sync,wdelay,hide,nocrossmnt,secure,no_root_squash,no_all_squash,no_subtree_check,secure_locks,acl,no_pnfs,anonuid=65534,anongid=65534,sec=sys,rw,secure,no_root_squash,no_all_squash)

重新加载 NFS 配置文件

exportfs [-aruv]

-a :全部挂载(或卸载) /etc/exports 里面的设定

-r :重新挂载 /etc/exports 裡面的設定,此外,亦同步更新 /etc/exports及 /var/lib/nfs/xtab 的內容!

-u :卸載某一目錄

-v :在 export 的時候,將分享的目錄顯示到螢幕上!

  • 重新挂载一次 /etc/exports 的设定
sh
$ exportfs -arv
  • 将已经分享的 NFS 目录资源,通通都卸载
sh
$ exportfs -auv
# 这时如果你再使用 showmount -e localhost 就会看不到任何资源了!

NFS 的安全性

  • NFS 端口的设定问题与解决方案:

一般来说, NFS 的服务仅会对内部网域开放,不会对因特网开放的。 然而,如果你有特殊需求的话, 那么也可能会跨不同网域就是了。 但是,NFS 的防火墙特别难搞,为什么呢? 因为除了固定的 port 111, 2049 之外, 还有很多不固定的端口是由 rpc.mountd, rpc.rquotad 等服务所开启的,所以,你的 iptables 就很难设定规则! 那怎办? 难道整个防火墙机制都要取消才可以?

为了解决这个问题, CentOS 7.x 有提供一个固定特定 NFS 服务的端口配置文件,那就是 /etc/sysconfig/nfs 啦!你在这个档案里面就能够指定特定的埠口,这样每次启动 nfs 时,相关服务启动的端口就会固定,如此一来, 我们就能够设定正确的防火墙啰! 这个配置文件内容很多,绝大部分的数据你都不要去更改,只要改跟 PORT 这个关键词有关的数据即可。 那么需要更改的 rpc 服务有哪些呢? 主要有 mountd, nlockmgr ,所以你应该要这样改:

sh
$ vim /etc/sysconfig/nfs
LOCKD_TCPPORT=30001
LOCKD_UDPPORT=30001
MOUNTD_PORT=1002
# 记得去掉注释,端口的值你也可以自行決定。

$ systemctl restart nfs #重新启动 NFS

$ rpcinfo -p | grep -E '(mount|nlock)' #查看端口是否生效
  • 开启防火墙
sh
$ firewall-cmd --permanent --add-port=111/tcp --add-port=111/udp --add-port=2049/tcp --add-port=2049/udp --add-port=30001/tcp --add-port=30001/udp --add-port=1002/tcp --add-port=1002/udp

$ firewall-cmd --reload

NFS 客户端的设定

手动挂载 NFS 服务器分享的资源

sh
# 启动 rpcbind
$ systemctl start rpcbind

# 查询服务器提供哪些资源
$ showmount -e 192.168.0.204
Export list for 192.168.0.204:
/www/filestore 192.168.0.0/24

# 本地建立挂载目录
$ mkdir /www/filestore/204

# 将本地目录挂载到服务器
$ mount -t nfs 192.168.0.204:/www/filestore /cfs/204
# 注意一下挂载的语法!『 -t nfs 』指定目录系统类型,IP:/dir 則是指定某一部主机的某個提供的目錄!

# 查看挂载状态
$ df -h
Filesystem                    Size  Used Avail Use% Mounted on
...(中间省略)...
192.168.0.204:/www/filestore   46G  1.5G   44G   4% /www/filestore/204

NFS 挂载参数

sh
$ mount -t nfs -o bg,soft,rsize=32768,wsize=32768 192.168.0.204:/www/filestore /cfs/204
参数参数功能默认参数
fg
bg
当执行挂载时,该挂载的行为会在前景 (fg) 还是在背景 (bg) 执行? 若在前景执行时,则 mount 会持续尝试挂载,直到成功或 time out 为止,若为背景执行, 则 mount 会在背景持续多次进行 mount ,而不会影响到前景的程序操作。 如果你的网络联机有点不稳定,或是服务器常常需要开关机,那建议使用 bg 比较妥当。fg
soft
hard
如果是 hard 的情况,则当两者之间有任何一部主机脱机,则 RPC 会持续的呼叫,直到对方恢复联机为止。 如果是 soft 的话,那 RPC 会在 time out 后『重复』呼叫,而非『持续』呼叫, 因此系统的延迟会比较不这么明显。 同上,如果你的服务器可能开开关关,建议用 soft 喔!hard
intr当你使用上头提到的 hard 方式挂载时,若加上 intr 这个参数, 则当 RPC 持续呼叫中,该次的呼叫是可以被中断的 (interrupted)。没有
rsize
wsize
读出(rsize)与写入(wsize)的区块大小 (block size)。 这个设定值可以影响客户端与服务器端传输数据的缓冲记忆容量。 一般来说, 如果在局域网络内 (LAN) ,并且客户端与服务器端都具有足够的内存,那这个值可以设定大一点, 比如说 32768 (bytes) 等,提升缓冲记忆区块将可提升 NFS 文件系统的传输能力! 但要注意设定的值也不要太大,最好是达到网络能够传输的最大值为限。rsize=1024
wsize=1024

卸载 NFS

sh
$ umount /www/filestore/204

开机自动挂载 NFS

sh
$ vim /etc/rc.d/rc.local
mount -t nfs -o bg,soft,rsize=32768,wsize=32768 192.168.0.204:/www/filestore /cfs/204
# 必须确保 /etc/rc.d/rc.local 有执行权限
$ chmod +x /etc/rc.d/rc.local

Released under the MIT License.